草庐IT

Java BufferedImage 内存消耗

全部标签

c++ - 在单线程应用程序中在堆栈上分配大量内存是否可以?

我知道如果你有一个多线程应用程序,并且你需要分配大量内存,那么你应该在堆上分配。堆栈空间在应用程序的线程之间划分,因此当您创建新线程时,每个线程的堆栈大小会变小。因此,如果您试图在堆栈上分配大量内存,它可能会溢出。但是,假设您有一个单线程应用程序,堆栈大小是否与堆大小基本相同?我在别处读到,堆栈和堆在地址空间中没有明确定义的边界,而是相互生长。附言被分配对象的生命周期不是问题。对象首先在程序中创建,并在退出时清理。我不必担心它会超出范围,从而从堆栈空间中清除。 最佳答案 不,堆栈大小与堆大小不同。堆栈对象以后进先出的方式被压入/弹出

c++ - std::shared_ptr 预分配内存

我想在一个堆请求(如std::make_shared)中为shared_ptr的控制block和value_type预分配内存,但是不要立即在其中构造任何对象。当我实际需要构造对象时,使用放置new。可能吗?std::make_shared或std::allocate_shared似乎都无法解决我的问题。 最佳答案 我建议创建延迟初始化包装类,它本身包含足够的内存供您稍后要初始化的对象使用。这个包装器甚至可以有特殊的方法来在析构函数中调用placementnew和delete初始化对象。

c++ - 确保 QByteArray 拥有它的内存 (QByteArray::fromRawData)

假设我们有一个功能商店voidstore(constQByteArray&data);此函数的工作是获取数据并将其存储起来。不幸的是,如果参数是用QByteArray::fromRawData(ptr,size)创建的,那么这样做是不安全的,因为它及其所有拷贝都要求ptr保持有效.因此store无法禁止其调用者传入这样的数组,将data视为constchar*在类固醇上或使用detach强制深度复制。所有这些都不令人满意,尤其是后者会损害性能,因为如果data在传递到store之前被COW复制,我们将进行不必要的深度复制。QByteArray有一个private函数nulTermina

java - Java 和 C++ 之间的共享内存

我试图在C++中创建一些内存并在Java中访问它。在C++方面,我知道我可以使用shm_open和mmap来获得内存区域并将一些数据写入其中。但是,我怎样才能打开Java端的内存映射文件?有人建议使用MappedByteBuffer但它如何访问提供给shm_open的“路径”(它只存在于内存中,因此无法从中初始化File)。我可以在不使用JNI的情况下执行此操作吗? 最佳答案 在Linux环境下共享内存有特殊的内存段:/dev/shmshm_open中提供的名称(例如“elo320”)用于创建文件/dev/shm/elo320这个路

c++ - 为维数增加(点数)的点云分配 CUDA 设备内存

我正在编写一个程序,我需要:对图像的每个像素进行测试如果测试结果为真,我必须向点云中添加一个点如果测试结果为假,什么都不做我已经在CPU端C++上编写了一个工作代码。现在我需要使用CUDA加速它。我的想法是让一些block/线程(我猜是每个像素一个线程)并行执行测试,如果测试结果为真,则让线程向云中添加一个点。我的麻烦来了:如果我事先不知道要插入到点云中的点数,我如何在设备内存中为点云分配空间(使用cudaMalloc或类似工具)?我是否必须分配固定数量的内存,然后在每次点云达到限制维度时增加它?还是有一种“动态”分配内存的方法? 最佳答案

c++ - 了解具有动态内存分配的二维数组

谁能帮我理解这段代码的最后一行?我不明白它是如何动态分配二维数组的。我知道在第6行,它创建了一个名为“a”的指针,并将其指向由“c”定义的大小为5的整数数组。我不明白的是“newint”语句是如何与等式中的r一起工作的。提前致谢。#includeconstintc=5;//numofcolumnsintmain(){intr=5;int(*a)[c];a=newint[r][c];//allocatearray} 最佳答案 如果你有一个类型T并且要分配一个大小为N的数组,那么这个表达式newT[N]返回分配数组的第一个元素的T*类型

c++ - 使用内存映射文件进行持久化 - 是否需要 volatile?

我需要在重新启动时持久保留uint64_t标记。为了实现这一点,我使用boost::interprocess::mapped_region来内存映射我在同一进程中创建的文件:bip::file_mappingfile(filename.c_str(),bip::read_write);autoregion=std::make_unique(file,bip::read_write);然后我将地址转换为我的uint64_t类型usingTag=uint64_t;Tag&curr_=*reinterpret_cast(region->get_address());现在我可以后递增标签,获取

c++ - 内存分配导致内存泄漏

c++的关于这个问题,我还有一个问题。回答者说第一个des=newchar[src.size()+1];会导致内存泄漏,因为des是一个局部变量,所以他随后建议了另一种方法。char*toNormalWord(conststd::string&src){char*des=newchar[src.size()+1];//stuffreturndes;}但是我不明白为什么局部变量会导致内存泄漏,第一个和第二个有什么区别。第二个不也是用des作为函数中的局部变量吗?我认为不同之处在于函数接收des作为参数或者只是创建它们自己。我想我不知道一些重要的事情,但我不知道那是什么......

c++ - 在类的构造函数中初始化映射时如何避免内存泄漏?

我想在一个类的构造函数中初始化一个(指向一个)map的指针。我编写的程序可以编译,但由于段错误而在运行时失败。我可以通过为map动态分配内存来解决问题,但是Valgrind通知我内存泄漏。如何正确初始化类?举个例子#include#include#include#includeclassMemoryLeak{public:MemoryLeak(std::vector&inp){inti=0;std::map*tmp=newstd::map;for(std::string&s:inp){//(*problem_map)[s]=i++;//Line12:causesasegfault(*t

c++ - 使用 Boost 在共享内存中创建循环缓冲区时出现问题

我正在尝试使用Boostcircular_buffer和进程间库在共享内存中创建一个循环缓冲区。我编译并运行了Interprocessdocumentation中给出的示例用于在共享内存中毫无问题地创建vector。但是,当我修改它以将Boostcircular_buffer用作:intmain(intargc,char*argv[]){managed_shared_memorysegment(create_only,"MySharedMemory",65536);constShmemAllocatoralloc_inst(segment.get_segment_manager());